package com.ztr.conversion.html2img;

import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;
import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.List;

/**
 * <p>
 * html 转 png 工具类
 * </p>
 */
@Slf4j
public class Html2PngUtil {

    /**
     * 将HTML字节码转换为PNG图片字节码列表。
     * 此方法通过解析HTML文档并将其每页转换为PNG图像，适用于将HTML内容批量转换为图像格式。
     *
     * @param htmlBytes HTML内容的字节码表示。
     * @return 包含每页HTML转换后的PNG图像字节码的列表。
     * @throws Exception 如果转换过程中发生错误，则抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static List<byte[]> htmlBytes2PngBytes(byte[] htmlBytes) {
        // 初始化文档对象，从HTML字节码创建
        Document doc = new Document(new ByteArrayInputStream(htmlBytes));
        // 设置PNG保存选项，包括分辨率、格式化和抗锯齿等设置
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.PNG);
        iso.setResolution(128);
        iso.setPrettyFormat(true);
        iso.setUseAntiAliasing(true);
        // 初始化PNG图像列表，用于存储转换后的每页图像字节码
        List<byte[]> pngList = Lists.newArrayList();
        // 遍历文档的每一页，将每页转换为PNG图像
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 设置当前页索引
            iso.setPageIndex(i);
            // 使用 ByteArrayOutputStream 来存储转换后的图像字节码
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            // 将当前页保存为PNG格式，结果存储在outputStream中
            doc.save(outputStream, iso);
            // 将当前页的PNG图像字节码添加到列表中
            pngList.add(outputStream.toByteArray());
        }
        // 返回包含所有页面PNG图像字节码的列表
        return pngList;
    }


    /**
     * 将HTML字节流转换为PNG图像文件列表。
     * 该方法通过解析HTML字节流，将每个页面转换为PNG图像文件，存储在指定的根目录下。
     *
     * @param htmlBytes   HTML内容的字节流。
     * @param imgRootPath 图像文件保存的根目录路径。
     * @return 包含每个页面转换后的PNG图像文件的列表。
     * @throws Exception 如果转换过程中发生错误。
     */
    @SneakyThrows(Exception.class)
    public static List<File> htmlBytes2PngFileList(byte[] htmlBytes, String imgRootPath) {
        // 初始化文档对象，解析HTML字节流。
        Document doc = new Document(new ByteArrayInputStream(htmlBytes));
        // 初始化图像保存选项，指定保存格式为PNG。
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.PNG);
        // 设置图像分辨率。
        iso.setResolution(128);
        // 设置为美化格式。
        iso.setPrettyFormat(true);
        // 开启抗锯齿。
        iso.setUseAntiAliasing(true);

        // 初始化存储PNG图像文件的列表。
        List<File> pngList = Lists.newArrayList();
        // 遍历文档的每一页，进行转换。
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 构造当前页图像文件的路径。
            String imgPath = imgRootPath + "/" + (i + 1) + ".png";
            // 设置当前页索引。
            iso.setPageIndex(i);
            // 将当前页保存为PNG图像文件。
            doc.save(imgPath, iso);
            // 将图像文件路径添加到列表中。
            pngList.add(new File(imgPath));
        }
        // 返回包含所有转换后图像文件的列表。
        return pngList;
    }


}
